自然語言處理(NLP)並不是一開始就有今天的 ChatGPT,它的發展經歷了不同時代的演進:從最早的規則判斷,到統計模型,再到機器學習與深度學習,最後才走到 LLM 的時代。
1.符號規則時代: 以語法規則、字典為主,像是 if-else 判斷或 Key-Value 的對應等等
def is_spam(text):
if "廣告" in text or "2025iThome" in text:
return True
return False
print(is_spam("我愛2025iThome鐵人賽!"))
輸出結果
True
2.統計方法時代: 靠機率模型(例如 N-gram),從大規模語料中學習規律
以下用 N-gram 示範,透過詞組的頻率來預測下一個詞:
from collections import Counter, defaultdict
import jieba
corpus = "我愛自然語言處理 我愛2025鐵人賽 自然語言處理很有趣"
# jieba 分詞
tokens = list(jieba.cut(corpus))
# 建立 bi-gram
bigrams = [(tokens[i], tokens[i+1]) for i in range(len(tokens)-1)]
counts = Counter(bigrams)
# 建立一個 dict:前一個詞 -> {下一個詞: 次數}
next_word_dict = defaultdict(Counter)
for w1, w2 in bigrams:
next_word_dict[w1][w2] += 1
# 預測函數
def predict_next(word, topk=3):
if word not in next_word_dict:
return None
return next_word_dict[word].most_common(topk)
# 測試
print("\n預測 '我' 的下一個詞:", predict_next("我"))
print("預測 '自然' 的下一個詞:", predict_next("自然"))
print("預測 '處理' 的下一個詞:", predict_next("處理"))
輸出結果
預測 '我' 的下一個詞: [('愛', 2)]
預測 '自然' 的下一個詞: [('語言', 2)]
預測 '處理' 的下一個詞: [(' ', 1), ('很', 1)]
3.機器學習時代: 使用 SVM、決策樹等方法做分類、分詞
以下用 SVM 做簡單文本分類示範:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.svm import LinearSVC
import jieba
def jieba_tokenizer(text):
return list(jieba.cut(text))
# 擴充訓練資料
corpus = [
"我愛鐵人賽", # 正常
"垃圾郵件不要點", # 垃圾
"恭喜你中獎了,點擊領取獎品", # 垃圾
"點擊這個連結可以拿紅包", # 垃圾
"鐵人賽文章很有幫助", # 正常
"我每天都在寫文章" # 正常
]
y = [1, 0, 0, 0, 1, 1]
vec = CountVectorizer(tokenizer=jieba_tokenizer)
X = vec.fit_transform(corpus)
clf = LinearSVC().fit(X, y)
test_text = "恭喜你得到鐵人賽第一名,點擊連結領獎!"
print(clf.predict(vec.transform([test_text]))[0])
輸出結果
0 #垃圾
4.深度學習時代: RNN、CNN 解決了更多語言任務
5.預訓練模型時代: BERT、GPT 系列出現,正式開啟了 LLM 的時代